home *** CD-ROM | disk | FTP | other *** search
- %
- %Date: Tue, 25 Oct 88 14:11:06 +0100
- %From: Joost Zalmstra <mcvax!nat.vu.nl!jjaz@uunet.UU.NET>
- %Subject: Re:Page Make-up Challenge
- %
- %Maybe the following set of macros can contribute to the solution of
- %the problem posed by David Rogers in TeXhax #86. It implements a floating
- %insertion with the following properties:
- % - Every insertion must be put in a \vbox. Customised macros can then
- % be used to place the white space for the figure and the figure caption
- % in this box.
- % - The order in which these \vbox-es are inserted is maintained.
- % - No more than two boxes are placed on one page: the first on the top
- % and the second on the bottom of the page.
- %
- %The proposed macro \figplace should create a \vbox with the correct layout
- %of the figure and then call \addfigure to put it in the insertionlist:
- %
- %\def\figplace#1#2#3#4{setbox0=\vbox{%
- %% here call macros to place figure and caption
- %}
- %\addfigure0}
- %
- %Note that the space separating the figure from the text should not
- %be included in the \vbox. The skipregister \figureskip is used for this
- %purpose.
- %
- %The macros are written in plain TeX, in fact the output routine given
- %here is an extension of the plain output routine (TeX-book page 364).
- %
- %The basic idea is that figures that won't fit on the current page
- %are kept on a list (the \box \figlist). This list is checked after
- %a \shipout and if not empty a maximum of two \vboxes is inserted
- %(using plains \topins) for the next page. As the insertions are \vboxes
- %it is easy to split the insertion and put one at the top and one at
- %the bottom of the page.
- %
- %Two further refinements should be mentioned here.
- %1) If the figures on a page take so much room that less than a specified
- %amount of space (given in dimen register \minpagesize) is left for
- %the text, this text is shifted through to the next page.
- %2) By inserting a \vbox with height \vsize (created by \vbox to \vsize..)
- %a page insert is created. No extra \figureskip will be include in this case.
- %
- %I have tested these macros with real input (16 pages with on the first
- %page the insertion of several figures) and it seems to work on the moment.
- %However, I'm not a TeX guru and I would expect that these macros can be
- %improved. One of the problems left is te fact that \addfigures must
- %be called in horizontal mode ( \vadjust won't work). I would therefore
- %apreciate comments, both on the macros as they stand and on how this
- %contributes to the Challenge.
- %
- %Joost Zalmstra.
- %
- %jjaz%nat.vu.nl@hearn.bitnet
- \newbox\figlist
- \newcount\figuresonpage \figuresonpage=0
- \newcount\figuresonlist \figuresonlist=0
- \newskip\figureskip \figureskip=1.2 pc plus 1 pc
- \newdimen\pagesize
- \newdimen\minpagesize \minpagesize=5 pc
- \newdimen\figuresizeonpage
-
- \def\addfigure#1{% add figure in box #1 to the document
- \ifnum\figuresonpage>1 % allready two figures on this page
- \addtolist{#1}% % so save for later
- \else
- \ifnum\figuresonlist>0 % figlist is not empty
- \addtolist{#1} % so save for later
- \else % no figures left over, so try to fit this one
- \dimen0=\ht#1
- \ifdim\dimen0<\vsize% not a pagesize figure
- \advance\dimen0 by \dp#1 % size of the box
- \advance\dimen0 by \figureskip % extra space below or above
- \fi
- \advance\dimen0 by \pagetotal
- \ifdim\dimen0>\pagegoal % no space on this page
- \addtolist{#1} % so save for later
- \else
- \advance\dimen0 by \figuresizeonpage
- \ifdim\dimen0>\dimen\topins % exceding maximum insertion size
- \addtolist{#1} % so save for later
- \else
- \figureinsert{#1} % insert the figure
- \fi
- \fi
- \fi
- \fi
- }
-
- \def\addtolist#1{% add box #1 to figlist
- \global\setbox\figlist=\vbox{%
- \nointerlineskip
- \box#1
- \unvbox\figlist}
- \global\advance\figuresonlist by 1
- }
-
- \def\figureinsert#1{% insert figure on this page
- \ifdim\ht#1<\vsize
- \insert\topins{\vbox{%
- \ifnum\figuresonpage=0
- \unvbox#1\vskip\figureskip % skip below the figure
- \else
- \vskip\figureskip\unvbox#1 % skip above the figure
- \fi
- }}
- \else
- \pageinsert
- \unvbox#1
- \endinsert
- \fi
- \global\advance\figuresonpage by 1
- \global\advance\figuresizeonpage by \ht#1
- \global\advance\figuresizeonpage by \dp#1
- \global\advance\figuresizeonpage by \figureskip
- }
- \def\checkfiglist{% see if there is a figure in the list that will
- % fit on the next page
- \ifnum\figuresonlist>0
- \global\setbox\figlist=\vbox{%
- \unvbox\figlist
- \setbox0=\lastbox
- \global\advance\dimen0\ht0
- \ifdim\ht0<\vsize
- \global\advance\dimen0 by \dp0
- \global\advance\dimen0 by \figureskip
- \fi
- \ifdim\dimen0>\vsize
- \vbox{\box0} % no room ; replace the figure
- \else
- \ifdim\dimen0>\dimen\topins
- \vbox{\box0}
- \else
- \global\advance\figuresonlist by -1
- \fi
- \fi
- \global\setbox0=\box0
- }
- \else
- {\setbox1=\box0 % make box0 void
- \global\setbox0=\box0}
- \fi
- }
- % Borrowing the macros from plain TeX
-
- \catcode`@=11
- \output{\myoutput}
- \def\myoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}%
- \advancepageno
- \global\figuresonpage=0
- \dimen0=0pt
- \global\figuresizeonpage = 0pt
- \checkfiglist % check if there is figure waiting and return it in box 0
- \ifvoid0 % nothing left
- \else
- \figureinsert0% insert this figure
- \checkfiglist % check for a second figure
- \ifvoid0\else
- \figureinsert0
- \fi
- \fi
- \ifvoid255\else\unvbox255\penalty\outputpenalty\fi % unused page back on list
- \ifnum\outputpenalty>-\@MM \else\dosupereject\fi}
-
- \def\pagecontents{%
- \ifnum\figuresonpage>0 % check for insertion of figures
- \unvbox\topins % place the figure(s) on top
- \ifnum\figuresonpage=2
- \setbox0=\lastbox % remove the second figure
- \fi
- \setbox1=\lastbox
- \unvbox1
- \fi
- % Check box 255
- \pagesize=\ht255
- \advance\pagesize by \dp255 % determine size of box 255
- \ifdim\pagesize>\minpagesize
- \dimen@=\dp255 \unvbox255 % the real page contents
- \else
- \message{tekstsize = \the\ht255, \the\dp255}
- \ifdim\ht255=0pt % box is empty
- \else
- \vfil % to small so leave for next page
- \fi
- \fi
- %
- \ifnum\figuresonpage=2
- \box0 % the second figure
- \fi
- \ifvoid\footins\else % footnote info is present
- \vskip\skip\footins
- \footnoterule
- \unvbox\footins\fi
- \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
-
- \catcode`@=12 % at signs no longer letters
-